package com.woniuxy.mini.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.sql.Types;
import java.util.Collections;

public class AutoGenerator {
    //手动设置项-数据源/基础包
    private static String url = "jdbc:mysql://192.168.1.43:3306/zy_mini_carto?serverTimezone=Asia/Shanghai"; //修改为你的数据库源
    private static String username = "root"; //修改为你的数据库连接名
    private static String password = "123456"; //修改为你的数据库连接密码
    private static String basePackage = "com.woniuxy.mini"; //修改为你的基础包名
    //自动设置项-代码输出目录
    private static String javaDir = "";
    private static String resourcesDir = "";
    private static String mapperXmlDir = "";

    //自动设置项-代码输出目录
    static {
        String projectDir = System.getProperty("user.dir");
        javaDir = projectDir + "\\css-Mini\\src\\main\\java";
        resourcesDir = projectDir + "\\css-Mini\\src\\main\\resources";
        mapperXmlDir = resourcesDir + "\\" + basePackage.replaceAll("\\.", "\\\\") + "\\mapper";
    }

    public static void main(String[] args) {
        generate();
    }

    private static void generate() {
        FastAutoGenerator.create(url, username, password)
                .globalConfig(builder -> {
                    builder.author("xgy") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(javaDir) // 指定输出目录
                            .disableOpenDir() // 生成结束不打开目录
                            .disableServiceInterface(); // 业务层取消接口化
                })
                .dataSourceConfig(builder -> builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
                    int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                    if (typeCode == Types.SMALLINT) {
                        // 自定义类型转换
                        return DbColumnType.INTEGER;
                    }
                    return typeRegistry.getColumnType(metaInfo);
                }))
                .packageConfig(builder -> {
                    builder.parent(basePackage) // 设置父包名
                            //.moduleName("system") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, mapperXmlDir)) // 设置mapperXml生成路径
                            .serviceImpl("service"); // 业务层实现类的包名
                })
                .strategyConfig(builder -> {
                    builder.entityBuilder().fileOverride() // 覆盖entity
                            //.idType(IdType.ASSIGN_ID) // 雪花ID
                            .serviceBuilder().convertServiceImplFileName(o -> o + "Service"); //重命名Service
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }

    //
}
